<?php
namespace HDPHP\Tool;
//p($_FILES);



//定义一个上传类
class upload{
//	定义一个错误的变量
	public $error;
//	设置一个路径变量
	private $path;
//	设置一个构造函数用来创建目录和接收参数
	public function __construct($path=NULL){
		//如果用户没有传参，默认就是Upload目录
		$this->path = is_null($path) ? './Upload/' : $path;
	}
		
//	重组上传数据	
	private function _resarry(){
		//echo "111";
	//	设置一个空数组
		$arr = array();
		
	//	循环上传数据把所有数据循环出来重新组合成新的数组
		foreach ($_FILES as  $value) {
//			如果$value是一个数组就说明是多文件上传
			if(is_array($value['name'])){
				foreach ($value['name'] as $k => $v) {
					//z($v) ;
					$arr[] = array(
						'name'=> $v,
						'type'=> $value['type'][$k],
						'tmp_name'=> $value['tmp_name'][$k],
						'error'=> $value['error'][$k],
						'size'=> $value['size'][$k],
					);}
			}else{
//				不是多文件上传就执行单文件上传
				$arr[]=$value;
			}
				//p($arr);
			
		}
		//把重新组合的数组返回出去
		return $arr;		
	}
	/*
	 * 筛选判断
	 */
	private function _shaixuan($data){
		
		$str = ltrim(strrchr($data['name'],"."),".");
		//echo $str;
		switch (true) {
			//1.是否没有文件上传
			case $data['error'] == 4:
				$this->error = '没有文件被上传';
				return false;
			//2.是否是一个合法的上传文件
			case !is_uploaded_file($data['tmp_name']):
				$this->error = '不是一个合法的上传文件';
				return false;
			//3.类型是否允许
			case !in_array($str, array('jpg','png','gif')):
				$this->error = '类型不允许';
				return false;
			//4.大小是否允许
			case $data['size'] > 20*1024*1024:
				$this->error = '文件大小超过限制';
				return false;
			//5.error的几种错误
				case $data['error'] == 3:
				$this->error = '文件只有部分被上传';
				return false;
				case $data['error'] == 2:
				$this->error = '大小超过 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
				return false;
				case $data['error'] == 1:
				$this->error = '大小超过了 php.ini 中 upload_max_filesize 限制值';
				return false;
			default:
				return true;
		}	
	}	
	public function up(){
		//把重组的数组拿出来。
		$arr = $this->_resarry();
		//把里面每一个值循环出来传给筛选函数
		foreach ($arr as $key => $value) {
			//筛选判断当有一个不成立就不执行
			if(!$this->_shaixuan($value)){
				return false;
			}
		}
		$pathArr = array();
		//3.移动上传
		foreach ($arr as $v) {
			//会把move之后的完整路径压入到$pathArr
			$pathArr[] = $this->_move($v);
		}
		//返回上传完成之后的路径，因为这些路径将来要存入数据库
		return $pathArr;
	
	}
	private function _move($data){
		//处理$data数据
		$type = ltrim(strrchr($data['name'], '.'),'.');
		//重新生成随机名字
		$fileName = time() . mt_rand(0, 20000) . '.' . $type;
		//获得设置路径
		$path = $this->path;
		//如果该路径存在就不创建不存在就递归创建
		is_dir($path) || mkdir($path,0777,true);
		// 组合新路径
		$fullPath = $path . $fileName;
		//把存在缓存目录的文件移动到设置的新路径当中
		move_uploaded_file($data['tmp_name'], $fullPath);
		//返回上传之后完整的路径
		return $fullPath;
	}	
	
}		
	


 ?>